/**
 * 通用验证工具函数
 */

// 尝试导入node-cron
import * as nodeCron from 'node-cron';

/**
 * 检查值是否为空
 * @param value 要检查的值
 * @returns 如果为空返回true，否则返回false
 */
export const isEmpty = (value: any): boolean => {
  return value === undefined || value === null || value === '';
};

/**
 * 验证邮箱格式
 * @param email 邮箱地址
 * @returns 是否有效
 */
export const isValidEmail = (email: string): boolean => {
  const emailRegex = /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/;
  return emailRegex.test(email);
};

/**
 * 验证手机号格式（中国大陆）
 * @param phone 手机号
 * @returns 是否有效
 */
export const isValidPhone = (phone: string): boolean => {
  const phoneRegex = /^1[3-9]\d{9}$/;
  return phoneRegex.test(phone);
};

/**
 * 验证密码复杂度
 * 至少6位
 * @param password 密码
 * @returns 是否有效
 */
export const isValidPassword = (password: string): boolean => {
  return password.length >= 6;
};

/**
 * 验证用户状态值
 * @param status 状态值
 * @returns 是否有效
 */
export const isValidStatus = (status: string): boolean => {
  return ['0', '1'].includes(status);
};

/**
 * 验证Cron表达式是否有效
 * @param cronExpression Cron表达式
 * @returns 是否有效
 */
export const isValidCron = (cronExpression: string): boolean => {
  try {
    if (isEmpty(cronExpression)) {
      return false;
    }
    
    // 尝试使用node-cron的验证函数
    if (nodeCron && typeof nodeCron.validate === 'function') {
      return nodeCron.validate(cronExpression);
    }
    
    // 如果node-cron不可用，使用正则表达式验证
    // 支持6位cron表达式（含秒）- 格式：秒 分 时 日 月 周
    const cronRegex6 = /^(\*|([0-9]|[1-5][0-9])|\*\/([0-9]|[1-5][0-9])) (\*|([0-9]|[1-5][0-9])|\*\/([0-9]|[1-5][0-9])) (\*|([0-9]|1[0-9]|2[0-3])|\*\/([0-9]|1[0-9]|2[0-3])) (\*|([1-9]|[1-2][0-9]|3[0-1])|\*\/([1-9]|[1-2][0-9]|3[0-1])) (\*|([1-9]|1[0-2])|\*\/([1-9]|1[0-2])) (\*|([0-6])|\*\/([0-6]))$/;
    
    // 也支持5位cron表达式（不含秒）- 格式：分 时 日 月 周
    const cronRegex5 = /^(\*|([0-9]|[1-5][0-9])|\*\/([0-9]|[1-5][0-9])) (\*|([0-9]|1[0-9]|2[0-3])|\*\/([0-9]|1[0-9]|2[0-3])) (\*|([1-9]|[1-2][0-9]|3[0-1])|\*\/([1-9]|[1-2][0-9]|3[0-1])) (\*|([1-9]|1[0-2])|\*\/([1-9]|1[0-2])) (\*|([0-6])|\*\/([0-6]))$/;
    
    return cronRegex6.test(cronExpression) || cronRegex5.test(cronExpression);
  } catch (error) {
    return false;
  }
}; 